
/**
 * 
 * 机器人活动区域
 * 
 * 
 * 题目描述

现有一个机器人，可放置于 M × N 的网格中任意位置，每个网格包含一个非负整数编号，当相邻网格的数字编号差值的绝对值小于等于 1 时，机器人可以在网格间移动。

问题：求机器人可活动的最大范围对应的网格点数目。

说明：网格左上角坐标为 (0,0) ，右下角坐标为 (m−1,n−1)，机器人只能在相邻网格间上下左右移动

示例1，输入如下网格

1	2	5	2
2	4	4	5
3	5	7	1
4	6	2	4
输出：6

说明：图中绿色区域，相邻网格差值绝对值都小于等于1，且为最大区域，对应网格点数目为6

示例2，输入如下网格

1	3	5
4	1	3
输出：1

说明：任意两个相邻网格的差值绝对值都大于1，机器人不能在网格间移动，只能在单个网格内活动，对应网格点数目为1

输入描述
第 1 行输入为 M 和 N

M 表示网格的行数
N 表示网格的列数
之后 M 行表示网格数值，每行 N 个数值（数值大小用 k 表示），数值间用单个空格分隔，行首行尾无多余空格。

M、 N、 k 均为整数
1 ≤ M，N ≤ 150,
0 ≤ k ≤ 50
输出描述
输出 1 行，包含 1 个数字，表示最大活动区域的网格点数目，行首行尾无多余空格。

用例
输入	4 4
1 2 5 2
2 4 4 5
3 5 7 1
4 6 2 4
输出	6
说明	
见描述中示例1，最大区域对应网格点数目为6
输入	2 3
1 3 5
4 1 3
输出	1
说明	见描述中示例2，最大区域对应网格点数目为1

 * 
 */

import java.util.Scanner;

/**
  * 
  题目解析
本题其实就是求最大的连通分量，相邻网格是否连通的规则如下

当相邻网格的数字编号差值的绝对值小于等于 1 时
因此可以使用深度优先搜索DFS来解题。

  */
public class 机器人活动区域 {
    
    static int m, n;
    static int[][] matrix;
    static boolean[][] visited;
    static int[][] offsets = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
 
        m = sc.nextInt();
        n = sc.nextInt();
 
        matrix = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                matrix[i][j] = sc.nextInt();
            }
        }
 
        // ans 记录题解
        int ans = 0;
 
        // visited[i][j] 记录位置 (i,j) 是否已访问过
        visited = new boolean[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                // 如果位置 (i,j) 未被访问过，则进行dfs探索
                if (!visited[i][j]) {
                    visited[i][j] = true;
                    ans = Math.max(ans, dfs(i, j, 1));
                }
            }
        }
 
        System.out.println(ans);
    }
 
    public static int dfs(int i, int j, int count) {
        // 向上下左右四个方向探索
        for (int[] offset : offsets) {
            int newI = i + offset[0];
            int newJ = j + offset[1];
 
            // 新位置（newI, newJ）不越界, 且和 (i, j) 位置的差值绝对值不超过1, 且未被访问过, 则可以进入
            if (newI >= 0 && newI < m && newJ >= 0 && newJ < n && Math.abs(matrix[i][j] - matrix[newI][newJ]) <= 1 && !visited[newI][newJ]) {
                visited[newI][newJ] = true;
                count = dfs(newI, newJ, count + 1);
            }
        }
 
        return count;
    }
    
}
